package com.stone.message.adapter.listener;

import com.stone.message.adapter.domain.event.ReceiveMessageEvent;
import com.stone.message.adapter.infra.consumer.MessageConsumer;
import org.springframework.context.ApplicationListener;

import java.util.HashMap;
import java.util.Map;

/**
 * ReceiveMessageEvent类型的消息监听器，监听容器中类型为ReceiveMessageEvent的事件
 *
 * @author Mr_wenpan@163.com 2021/6/28 11:39 上午
 */
public class ReceiveMessageEventListener implements ApplicationListener<ReceiveMessageEvent> {

    /**
     * 容器中所有消费者集合，方便统一管理。方便在容器中消息发布的时候，能够通过key准确的找到consumer，来进行消息消费
     * key：队列编码，value：对应着具体的消费者
     * 类似观察者模式
     */
    private final Map<String, MessageConsumer> consumerAdapterMap;

    public ReceiveMessageEventListener() {
        consumerAdapterMap = new HashMap<>();
    }

    /**
     * 根据队列获取具体消费者
     *
     * @param queue 队列
     * @return com.message.adapter.consumer.MessageConsumer
     * @author Mr_wenpan@163.com 2021/7/17 6:04 下午
     */
    public MessageConsumer getConsumerByQueue(String queue) {
        return consumerAdapterMap.get(queue);
    }

    /**
     * 当容器中有发布ReceiveMessageEvent类型的事件时，自动回调这个方法
     *
     * @param receiveMessageEvent 事件
     * @author Mr_wenpan@163.com 2021/6/28 11:49 上午
     */
    @Override
    public void onApplicationEvent(ReceiveMessageEvent receiveMessageEvent) {
        String queue = receiveMessageEvent.getQueue();
        MessageConsumer messageConsumer = consumerAdapterMap.get(queue);
        messageConsumer.onMessage(receiveMessageEvent);
    }

    /**
     * 注册消费者
     *
     * @param messageConsumer 适配器
     */
    public void register(MessageConsumer messageConsumer) {
        consumerAdapterMap.put(messageConsumer.queue(), messageConsumer);
    }
}